package top.malaoshi.webmvc.parameter;

import top.malaoshi.webmvc.info.MethodsArgumentInfo;
import top.malaoshi.webmvc.exception.ParameterTypeMatchValueException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 数组类型是基本数据类型的，包括：
 * short、int、long、float、double、boolean
 */
public class BaseTypeResolver extends AbstractResolver implements RequestParamAndMethodArgsResolver {
    @Override
    public Object resolver(HttpServletRequest request, HttpServletResponse response , MethodsArgumentInfo mai) {

        checkNameAndValue(mai);
        String parameterName = getName(mai);
        String valueStr = request.getParameter(parameterName);
        // 获取类型
        Class type = mai.getType();
        // 如果Controlle中形参是 Integer类型，而且没有required为true，那么可以为null
        if(valueStr == null || "".equals(valueStr)) {
            String msg = String.format("从request取出的值是[ %s ]，但形参[ %s ]类型是[ %s数组 ]，不能赋值",
                    valueStr,mai.getName(),mai.getType().getComponentType().getName());
            throw new ParameterTypeMatchValueException(msg);
        }else {
            Object ret = null;
            try {
                if(type == int.class){
                    ret = Integer.parseInt(valueStr);
                }else if(type == short.class){
                    ret = Short.parseShort(valueStr);
                }else if(type == long.class){
                    ret = Long.parseLong(valueStr);
                }else if(type == float.class){
                    ret = Float.parseFloat(valueStr);
                }else if(type == double.class){
                    ret = Double.parseDouble(valueStr);
                }else if(type == boolean.class){
                    ret = Boolean.parseBoolean(valueStr);
                }

                return ret;
            } catch (Exception e) {
                // 如果valueStr为非数字字符串
                String msg = String.format("从request取出的值是[ %s ]，但形参[ %s ]类型是[ %s数组 ]，不能赋值",
                        valueStr,mai.getName(),mai.getType().getComponentType().getName());
                throw new ParameterTypeMatchValueException(msg);
            }
        }
    }
}
